package ar.edu.frba.utn.dds.Busqueda;

import java.util.ArrayList;
import java.util.List;

import ar.edu.frba.utn.dds.Aerolinea.AeroLinea;
import ar.edu.frba.utn.dds.Excepciones.ConversionException;
import ar.edu.frba.utn.dds.Usuario.Usuario;
import ar.edu.frba.utn.dds.Vuelo.Asiento;
import ar.edu.frba.utn.dds.Vuelo.Vuelo;

public class Busqueda {
	List<Asiento> asientosDisponibles = new ArrayList<Asiento>();

	public List<Asiento> getAsientosDisponibles() {
		return asientosDisponibles;
	}

	public void setAsientosDisponibles(List<Asiento> asientosDisponibles) {
		this.asientosDisponibles = asientosDisponibles;
	}
	
	/**
	 * Metodo que se encarga de realizar el filtrado de los asientos que cumplen las condiciones
	 * @param viaje
	 * @param user
	 * @return
	 * @throws ConversionException 
	 */
	public List<Asiento> obtenerAsientos(Vuelo vueloDeseado, AeroLinea aerolinea,Usuario user) throws ConversionException {
		List<Asiento> asientosDisponibles = new ArrayList<Asiento>();
		aerolinea.getBusqueda().buscarVuelosDisponibles(aerolinea, vueloDeseado);
		for (Vuelo vuelo : aerolinea.getVuelos()){
			for(Asiento asiento : vuelo.getAsientosVuelo()){
				if (this.requisitoVistaAsiento(asiento, user)){
					if (aerolinea.getConversorAerolinea().condicionParametrosBusqueda()){
						if(aerolinea.getConversorAerolinea().cumpleCondicionesDeBusqueda(asiento, vueloDeseado)){
							asientosDisponibles.add(asiento);
						}
					}else{
						asientosDisponibles.add(asiento);
					}
				}
					
			}
		}
		return asientosDisponibles;
	}

	/**
	 * Metodo que devuelve una booleana informando si es factible que el usuario vea dicho asiento
	 * @param asiento
	 * @param user
	 * @return
	 */
	private boolean requisitoVistaAsiento(Asiento asiento, Usuario user) {
		if (asiento.sosSuperOferta(user) && user.getPerfil().asientosOfertas()) {
			return true;
		} else if (asiento.sosSuperOferta(user)
				&& (!user.getPerfil().asientosOfertas())) {
			return false;
		} else
			return true;
	}
}
